/* // 定义类的结构
// PersonInterface 接口，用于限制 Person 类的格式
interface PersonInterface {
  name: string
  age: number
  speak(n: number): void
}

// 定义一个类 Person, 实现 PersonInterface 接口
class Person implements PersonInterface {
  constructor(
    public name: string,
    public age: number
  ) { }
  // 实现接口中的 speak 方法
  speak(n: number): void {
    for (let i = 0; i < n; i++) {
      // 打印出包含名字和年龄的问候语句
      console.log(`你好，我叫${this.name}，我的年龄是${this.age}`)
    }
  }
}

// 创建一个 Person 类的实例 p1, 传入名字 'tom' 和年龄 18
const p1 = new Person('tom', 18)
p1.speak(3) */

// 定义对象结构
interface UserInterface {
  name: string
  readonly gender: string // 只读属性
  age?: number  // 可选属性
  run: (n: number) => void
}

// const a: number = 1
const user: UserInterface = {
  name: "张三",
  gender: '男',
  age: 18,
  run(n: number) {
    console.log(`奔跑了${n}米`)
  }
}
// user.gender = '女' // 警告
user.run(2)

// 定义函数结构
interface CountInterface {
  (a: number, b: number): number;
}
const count: CountInterface = (x, y) => {
  return x + y
}

type CountFunc = (x: number, y: number) => number
const count2: CountFunc = (x, y) => x + y

/* // 接口之间的继承
interface PersonInterface {
  name: string  // 姓名
  age: number   // 年龄
}

interface StudentInterface extends PersonInterface {
  grade: string // 年级
}

const stu: StudentInterface = {
  name: '张三',
  age: 25,
  grade: '高三'
} */

// 接口自动合并(可重复定义)
// PersonInterface 接口
interface PersonInterface {
  // 属性声明
  name: string
  age: number
}

// 给 PersonInterface 接口添加新属性
interface PersonInterface {
  // 方法声明
  speak(): void
}

// Person 类实现 PersonInterface
class Person implements PersonInterface {
  constructor(
    public name: string,
    public age: number,
  ) {}

  // 方法
  speak() {
    console.log('你好！我是老师：', this.name)
  }
}

const p = new Person('tom', 22)
p.speak()